\documentclass[twoside,colorback,accentcolor=tud4c,11pt]{tudreport}
\usepackage{ngerman}

\usepackage[utf8]{inputenc}

\usepackage{listings}
\lstset{
numbers=left,
numberstyle=\footnotesize,
frame=l,
breaklines=true,
basicstyle=\footnotesize,
showstringspaces=false
}
 
\usepackage[stable]{footmisc}
\usepackage[ngerman,pdfview=FitH,pdfstartview=FitV]{hyperref}

\usepackage{graphicx}
\usepackage{caption}
\usepackage{subcaption}

\usepackage{booktabs}
\usepackage{multirow}
\usepackage{longtable}

\newlength{\longtablewidth}
\setlength{\longtablewidth}{0.675\linewidth}

\title{Praktikum adaptive Computersysteme}
\subtitle{Ausarbeitung\\5. Phase: Slave-Mode Version}
\subsubtitle{Wilko Kunert, Alexander Schleich}
\lowertitleback{\hfill\today}
\institution{Embedded Systems \& Applications}

\begin{document}
\maketitle

\tableofcontents

\chapter{Einleitung}

In Phase 5 soll die Software aus Phase 3 (Kontrastberechnung) nun fast vollständig auf die Hardware ausgelagert werden. D.h. die gesamte
Berechnung soll auf der Hardware erfolgen. Die Software schreibt lediglich die Bildpunkte zur Hardware und liest die neu berechneten 
Werte wieder aus. 

\chapter{HDL-Modell}

In Zeile 40 beginnt die Berechnung von Minimum und Maximum. \\
Ist die Adresse durch ``stepSizeAddress'' codiert, erwarten wir anliegende Bildpunktwerte in DATAIN und prüfen
ob der aktuelle Wert größer als das bisherige Maximum und/oder kleiner als das bisherige Minimum sind und die bisherigen
Min/Max Werte werden ersetzt. \\
Weiterhin wird der Dividend (Eingang des Dividierers) auf 4080 gesetzt (255 vier mal links geschoben um die Genauigkeit zu erhöhen) sowie der Divisor auf \textit{Maximum - Minimum}.
addresses[0] wird auf \textit{stepSizeAddress} gesetzt und durch das bereits in Phase4 vorgestellte Pipeline-Verfahren 18 Takte nach oben ``geschoben''. Die Latenz beträgt diesmal 18 Takte, da der Dividenden-Eingang verbreitert wurde.\\
Sobald die letzte Stelle erreicht ist, wird in Zeile 36 der berechnete Quotient ausgewertet und in das Register ``stepSize'' geschrieben. \\
In Zeile 53 werden die erneut gesendeten Bildpunktwerte in das Data-Register geschrieben.
Die Berechnung in Zeile 19 liefert den neuen (aufgespreizten) Wert des Bildpunktes. Die erneuten Shifts sind hier notwendig, 
um die vorherigen Shifts rückgängig zu machen.
Das Ergebnis lieft sofort auf dem DATAOUT und steht also direkt zur Verfügung. 


\begin{figure}[h]
\centering
\begin{minipage}{\linewidth}
\lstset{language=Verilog,linewidth=0.9\linewidth,firstnumber=16}
\begin{lstlisting}
  localparam noAddress = 32;
  localparam stepSizeAddress = 31;

  assign result = (((data-minimum) << 4)*stepSize)>>8;
  assign DATAOUT = result;
  
  // Steuerung
  always @(posedge CLK or posedge RESET) begin
      
      // Initialisiere Register
     if (RESET) begin
	    data  <= 8'h00;
	    minimum = 255;
	    maximum = 0;
	    addresses[0] <= noAddress;
	    dividend <= 16'hFFFF;
	    divisor <= 8'h01;
	    //Schreibzugriff auf RC
     end 
     else begin
	    if (addresses[17] == stepSizeAddress) begin
	       stepSize <= quot;
	    end
	 
	    if (ADDRESSED & WRITE) begin
	       if (ADDRESS[7:2] == stepSizeAddress) begin
	          if (DATAIN > maximum) begin
		   	     maximum = DATAIN;
	          end 
	          if (DATAIN < minimum) begin
		         minimum = DATAIN;
	          end
	    
	          dividend <= 255 << 4;
	          divisor <= (maximum - minimum);
	          addresses[0] <= stepSizeAddress;			  
	       end 
	       else if (ADDRESS[7:2] == 0) begin
	          data <= DATAIN;
	       end
	    end 
     end    
  end

endmodule
\end{lstlisting}
\end{minipage}
\caption{user.v - Steuerung}
\end{figure}

\chapter{C-Programm}

Das C-Programm ist sehr einfach. In zwei Durchläufen werden lediglich die Bildpunkte an die Hardware übertragen.
Beim ersten Durchlauf (Zeile 7) werden die Werte nur geschrieben, um die Minima und Maxima zu ermitteln und daraus die stepSize zu berechnen. Im zweiten Durchlauf werden die Werte geschrieben 
und die berechneten Werte sofort wieder ausgelesen (Zeile 10).


\begin{figure}[h]
\centering
\begin{minipage}{\linewidth}
\lstset{language=Verilog,linewidth=0.9\linewidth,firstnumber=1}
\begin{lstlisting}
for (m = 0; m < 2; ++m)
{
	for (n = 0, p = (void*) image; n < 256*256; ++p, ++n)
	{
		switch (m)
	    {
	    	case 0:
	      		rcu[31] = *p;
	      	break;
	    	case 1:
	      		rcu[0] = *p;
	      		*p = rcu[0];
	      	break;
	    }
	}
}

endmodule
\end{lstlisting}
\end{minipage}
\caption{user.v - Steuerung}
\end{figure}

\chapter{Ergebnisse}

Gesamtlaufzeit unserer Lösung beträgt 110222 us.
Die Korrektheit unserer Lösung haben wir hier per ``Hand'' geprüft, d.h. wir haben die Werte in der C Software ausgegeben.
Auch der Vergleich zwischen den Bildern bestätigt, dass eine Kontrastspreizung erfolgreicht durchgeführt wurde.

 
\begin{figure}[h]
\centering
\begin{subfigure}[b]{0.45\textwidth}
\centering
\includegraphics[width=\textwidth]{graphics/lena256.png}
\caption{lena256.pgm}
\end{subfigure}
\begin{subfigure}[b]{0.45\textwidth}
\centering
\includegraphics[width=\textwidth]{graphics/lena256c.png}
\caption{lena256c.pgm}
\end{subfigure}
\caption{Kontrastspreizung}
\label{fig:kontrastspreizung}
\end{figure}


	

\end{document}
